# LeetCode 50、Pow(x,n)
# 一、题目描述
实现 pow(x, n) ,即计算 x
的整数 n
次幂函数(即,x^n
)。
示例 1:
输入:x = 2.00000, n = 10
输出:1024.00000
示例 2:
输入:x = 2.10000, n = 3
输出:9.26100
示例 3:
输入:x = 2.00000, n = -2
输出:0.25000
解释:2-2 = 1/22 = 1/4 = 0.25
提示:
-100.0 < x < 100.0
-2^31 <= n <= 2^31-1
-10^4 <= xn <= 10^4
# 二、题目解析
# 三、参考代码
# 1、Java 代码
// 登录 AlgoMooc 官网获取更多算法图解
// https://www.algomooc.com
// 作者:程序员吴师兄
// 微信:wzb_3377
// 代码有看不懂的地方一定要私聊咨询吴师兄呀
// Pow(x,n)(LeetCode 50):https://leetcode.cn/problems/powx-n/
class Solution {
public double myPow(double x, int n) {
// 递归终止条件
if (n == 0) {
// 任何数的 0 次方的结果都是 1 ,由于题目要求返回 double 类型,因此返回 1.0
return 1.0;
// 判断 n 是奇数还是偶数
// 1、如果是偶数
} else if ((n & 1) == 0) {
// 那么只需要先计算出 y = x * x 的结果
// 然后 y 的次幂就是 n / 2
return myPow(x * x, n / 2);
// 2、如果是奇数
} else {
// 比如 n = 9 ,那么它就可以被划分为 4 + 4 + 1,即 x^4 * x^4 * x
// 并且,这个时候还需要判断一下 n 是否为负数
// 如果是正数
if( n > 0 ){
// 直接抽离出一个 x 来,然后和 myPow(x * x, n / 2) 进行相乘
return x * myPow(x * x, n / 2);
// 如果是负数
}else{
/测试*/
// int a = -9;
// int b = a / 2;
// System.out.println(b);
// 输出结果为 -4
/结束测试*/
// 比如 n = -9
// 无论正数还是负数,除 2 是向零取整。
// 此时 n / 2 = -4
// (x * x)^-4 = x ^ -8
// 因此 myPow(x * x, n / 2) 的结果还差一个 x ^ -1 才能还原原来的结果 x ^ -9
// 由于题目要求返回 double 类型,因此这里使用 1.0
return myPow(x * x, n / 2) * (1.0 / x) ;
}
}
}
}
# **2、**C++ 代码
class Solution {
public:
double myPow(double x, int n) {
// 递归终止条件
if (n == 0) {
// 任何数的 0 次方的结果都是 1 ,由于题目要求返回 double 类型,因此返回 1.0
return 1.0;
// 判断 n 是奇数还是偶数
// 1、如果是偶数
} else if ((n & 1) == 0) {
// 那么只需要先计算出 y = x * x 的结果
// 然后 y 的次幂就是 n / 2
return myPow(x * x, n / 2);
// 2、如果是奇数
} else {
// 比如 n = 9 ,那么它就可以被划分为 4 + 4 + 1,即 x^4 * x^4 * x
// 并且,这个时候还需要判断一下 n 是否为负数
// 如果是正数
if( n > 0 ){
// 直接抽离出一个 x 来,然后和 myPow(x * x, n / 2) 进行相乘
return x * myPow(x * x, n / 2);
// 如果是负数
}else{
// 比如 n = -9
// 无论正数还是负数,除 2 是向零取整。
// 此时 n / 2 = -4
// (x * x)^-4 = x ^ -8
// 因此 myPow(x * x, n / 2) 的结果还差一个 x ^ -1 才能还原原来的结果 x ^ -9
// 由于题目要求返回 double 类型,因此这里使用 1.0
return myPow(x * x, n / 2) * (1.0 / x) ;
}
}
}
};
# 3、Python 代码
class Solution:
def myPow(self, x: float, n: int) -> float:
# 递归终止条件
if n == 0 :
return 1.0
elif n == -1 :
# 任何数的 0 次方的结果都是 1 ,由于题目要求返回 double 类型,因此返回 1.0
return 1/x
# 判断 n 是奇数还是偶数
# 1、如果是偶数
elif n & 1 == 0 :
# 那么只需要先计算出 y = x * x 的结果
# 然后 y 的次幂就是 n / 2
return self.myPow(x * x, n // 2)
# 2、如果是奇数
else :
# 比如 n = 9 ,那么它就可以被划分为 4 + 4 + 1,即 x^4 * x^4 * x
# 并且,这个时候还需要判断一下 n 是否为负数
# 如果是正数
if n > 0 :
# 直接抽离出一个 x 来,然后和 myPow(x * x, n / 2) 进行相乘
return x * self.myPow(x * x, n // 2)
# 如果是负数
else :
# 比如 n = -9
# Python 比较特殊,正数负数除以 2 取整有区别
# a = -9
# b = a // 2
# print(b) 输出为 -5
# 此时 n / 2 = -5
# (x * x)^-5 = x ^ -10
# 因此 myPow(x * x, n / 2) 的结果还差一个 x ^ 1 才能还原原来的结果 x ^ -9
# 由于题目要求返回 double 类型,因此这里使用 1.0
return self.myPow(x * x, n // 2) * x